////////////////////////////////////////////////////////////
//
// SFML GUI - Simple and Fast GUI Library
// Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com) (for SFML)
// Copyright (C) 2010 Janniaux Alexandre (alexand69580@yahoo.fr) (for GUI)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it freely,
// subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented;
//    you must not claim that you wrote the original software.
//    If you use this software in a product, an acknowledgment
//    in the product documentation would be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such,
//    and must not be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
////////////////////////////////////////////////////////////

#ifndef GUI_LISTERNER_INCLUED
#define GUI_LISTERNER_INCLUED

#include <list>
#include <queue>
#include <iostream>

#include "Widget.hpp"
#include "Singleton.hpp"

#include "Gui.hpp"

namespace gui
{

class GuiListener : public Singleton<GuiListener>
{
    public:

        void AddWidget(Widget* widget);
        void RemoveWidget(Widget* widget);
        void SetFocusWidget(Widget* widget);

        bool PushEvent(sf::Event& event);

        void AddEvent(sf::Event& event);
        bool GetEvent(sf::Event& event);

        void RefusePressEvent();
        void RefuseHoveredEvent();
        void RefuseFocusEvent();

        void RenderGui(sf::RenderTarget& target);
    protected:
        friend class Singleton<GuiListener>;
        GuiListener();

        bool ProcessKeyEvent(sf::Event& event);
        bool ProcessMouseEvent(sf::Event& event, Widget* base=NULL);

    private:
        std::list<Widget* > myWidgets;
        Widget* myFocusWidget;
        Widget* myPressedWidget;
            sf::Event myPressedEvent;
        Widget* myHoveredWidget;

        std::queue<sf::Event> myEvents;

}; // class GuiListener

} // namespace gui


#endif // GUI_LISTENER_INCLUED


